﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using Main.Reseau;
using System.Threading;
using Main;
using System.IO;

namespace Reseau
{
    static class Program
    {
        static Thread threadEcrireVersTransport;
        static Thread threadLireDeTransport;

        /// <summary>
        /// Point d'entrée principal de l'application.
        /// </summary>
        static void Main()
        {
            //On supprime les fichiers qui peuvent contenir des données d'une exécution précédente
            File.Delete(REGLES.L_ECRITURE);
            File.Delete(REGLES.L_LECTURE);

            //Instanciation des threads et démarrage
            CoucheReseau coucheReseau = new CoucheReseau();

            threadEcrireVersTransport = new Thread(coucheReseau.EcrireVersTransport);
            threadLireDeTransport = new Thread(coucheReseau.LireDeTransport);
            threadLireDeTransport.Priority = ThreadPriority.Highest;

            Console.WriteLine("Demarrage : Ecrire Vers Transport");
            threadEcrireVersTransport.Start();

            Console.WriteLine("Demarrage : Lire de Transport");
            threadLireDeTransport.Start();

            //Démarrage de la méthode à être exécutée par le processus principal
            Console.WriteLine("Demarrage : Traitement des primitives recues");
            coucheReseau.TraiterPrimitivesDeTransport();

            //On attend que le canal soit vide de toutes données avant d'arrêter les threads
            Console.WriteLine("Attente que le pipe RESEAU_TO_TRANSPORT soit vide");
            coucheReseau.pipeReseauToTransport.WaitForPipeDrain();
            threadEcrireVersTransport.Abort();
            threadLireDeTransport.Abort();

            //Déconnexion et fermeture des canaux
            coucheReseau.pipeReseauToTransport.Disconnect();
            coucheReseau.pipeReseauToTransport.Close();

            coucheReseau.pipeTransportToReseau.Dispose();

            Console.WriteLine("Simulation terminee, appuyez sur un touche pour quitter...");
            Console.ReadKey();
            Environment.Exit(0);
        }
    }
}
